/**
 * Definição do pacote da classe.
 */
package Controler;

/**
 * Definição dos imports utilizados na classe.
 */
import Model.Usuario;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Logger;

/**
 *Classe que manipula as instancias do objeto Usuário junto ao Banco de Dados.
 * @author Carlos
 */
public class UsuarioDAO extends ConexaoMySQL{
    
    /**
     * Geração de Log.
     */
    private static final Logger log = Logger.getLogger(UsuarioDAO.class.getName());
    
    /**
     * Atributo do tipo Connection, contem a conexão com o Banco de Dados.
     */
    private Connection cx;
    
    /**
     * Método construtor sem parametro que retorna uma conexão com o Banco de Dados.
     * @throws SQLException
     * @throws ClassNotFoundException 
     */
    public UsuarioDAO() throws SQLException, ClassNotFoundException {
        this.cx = getMyDBConnection();
    }
    
    /**
     * Método contrutor com parametro que retorna a conexão com o Banco de Dados.
     * @param cx 
     */
    public UsuarioDAO(Connection cx){
    this.cx = cx;
}
    /**
     * Método que retorna do Banco de Dados um usuário.
     * @param matricula
     * @param senha
     * @return Usuario.
     * @throws SQLException 
     */
    public Usuario getUsuario(String matricula, String senha) throws SQLException{
        PreparedStatement pst = null;
        ResultSet rs = null;
        try{
        pst = (PreparedStatement) cx.prepareStatement("SELECT * FROM tb_conta_usuario WHERE senha = ? AND matricula = ?");
        pst.setString(1, senha);
        pst.setString(2, matricula);
        rs = pst.executeQuery();
        if (rs.next()){
            Usuario usr = getUsuarioFromSQL(rs);
            /**
             * Informação para o log.
             */
            log.info("Consulta de usuario foi executada e bem sucedida.");
            return usr;
        }
        }finally{
            pst.close();
            rs.close();            
        }
        /**
          * Informação para o log.
          */
        log.info("Consulta de usuario foi executada, mas sem retorno.");
        return null;        
    }
    
    /**
     * Método que retorna um objeto do tipo Usuario do Banco de Dados.
     * @param rs
     * @return Usuario.
     * @throws SQLException 
     */
    private Usuario getUsuarioFromSQL(ResultSet rs) throws SQLException {
        Usuario usuarioRetornado = new Usuario(rs.getString("nome"),rs.getString("matricula"),rs.getString("senha"),rs.getString("sexo"),rs.getString("email"), rs.getInt("tb_permissao_cod_permissao"));
        /**
          * Informação para o log.
          */
        log.info("Objeto Usuario foi carregado do Banco de Dados.");
        
        return usuarioRetornado;
    }
    
    /**
     * Método que cadastra um usuário no Banco de Dados.
     * @param nome
     * @param matricula
     * @param senha
     * @param sexo
     * @param email
     * @param permissao
     * @return true ou false
     * @throws SQLException 
     */
    public boolean cadastraUsuario(String nome, String matricula, String senha, String sexo, String email, int permissao) throws SQLException{
        PreparedStatement pst = null;
        int equ = 0;
        
        try{
        pst = (PreparedStatement) cx.prepareStatement("INSERT INTO tb_conta_usuario (id_usuario, nome, matricula, senha, sexo, email, tb_permissao_cod_permissao) VALUES (NULL, ?, ?, ?, ?, ?, ?)");
        pst.setString(1, nome);
        pst.setString(2, matricula);
        pst.setString(3, senha);
        pst.setString(4, sexo);
        pst.setString(5, email);
        pst.setInt(6, permissao);
        equ = pst.executeUpdate();
        if(equ!=0){
            /**
              * Informação para o log.
              */
        log.info("Cadastro no banco de dados bem sucedido.");
            return true;
        }
         }finally{
            pst.close();      
        }
             /**
              * Informação para o log.
              */
        log.info("Tentativa de cadastro no banco de dados falhou.");
        return false;        
    }
    
    /**
     * Método que atualiza os dados de um Usuario no Bamco de Dados.
     * @param nome
     * @param matricula
     * @param senha
     * @param sexo
     * @param email
     * @return true ou false
     * @throws SQLException 
     */
    public boolean atualizaCadastroUsuario(String nome, String matricula, String senha, String sexo, String email) throws SQLException{
        PreparedStatement pst = null;
        int equ = 0;
        
        try{
        pst = (PreparedStatement) cx.prepareStatement("UPDATE tb_conta_usuario SET nome = ?, senha = ?, sexo = ?, email = ? WHERE matricula = ?;");
        pst.setString(1, nome);
        pst.setString(2, senha);
        pst.setString(3, sexo);
        pst.setString(4, email);
        pst.setString(5, matricula);
        equ = pst.executeUpdate();
        if(equ!=0){
            /**
              * Informação para o log.
              */
        log.info("Atualização dos dados cadastrais do usuario bem sucedido.");
            return true;
        }
         }finally{
            pst.close();      
        }
            /**
              * Informação para o log.
              */
        log.info("Atualização dos dados cadastrais do usuario falhou.");
        return false;        
    }
    /**
     * Método que verifica se a matricula já não esta cadastrada.
     * @param matricula
     * @return true ou false
     * @throws SQLException 
     */
public boolean verificaUsuario(String matricula) throws SQLException{
        PreparedStatement pst = null;
        ResultSet rs = null;
        try{
        pst = (PreparedStatement) cx.prepareStatement("SELECT * FROM tb_conta_usuario WHERE matricula = ?");
        pst.setString(1, matricula);
        rs = pst.executeQuery();
        if (rs.next()){
            /**
             * Informação para o log.
             */
            log.info("Verificação de usuario foi executada e bem sucedida.");
            log.info(""+matricula+" já cadastrada!");
            return true;
        }
        }finally{
            pst.close();
            rs.close();            
        }
        /**
          * Informação para o log.
          */
        log.info("Consulta de usuario foi executada, mas sem retorno.");
        log.info(""+matricula+" ainda não cadastrada!");
        return false;        
    }    
    
}
